package com.zlop.common.response;

import java.io.Serializable;

/**
 * Restful 接口返回结果
 * 
 * @author	曾令鹏
 * @since	1.0
 * @version 2018年5月8日 曾令鹏
 * @param <T> 数据类型
 */
public class RestfulResponse<T> implements Serializable{
    
    /**
     * 序列化ID
     */
    private static final long serialVersionUID = -7115914438015603229L;

    /**
     * 默认响应码
     */
    public static final int DEFAULT_CODE = 1000;
    
    /**
     * 响应码
     */
    private int code = DEFAULT_CODE;
    
    /**
     * 数据
     */
    private T data;
    
    /**
     * 提示信息
     */
    private String message;
    
    /**
     * 构造函数
     */
    private RestfulResponse() {
        this(null, CodeEnum.SUCCESS);
    }

    /**
     * 构造函数
     * @param data 响应数据
     */
    private RestfulResponse(T data) {
        this(data, null);
    }
    
    /**
     * 构造函数 
     * @param code 响应编码状态枚举
     */
    private RestfulResponse(CodeEnum code) {
        this(null, code);
    }
    
    /**
     * 构造函数
     * @param data 响应数据
     * @param code 响应编码状态枚举
     */
    public RestfulResponse(T data, CodeEnum code) {
        this.data = data;
        if (code != null) {
            this.code = code.getCode();
            this.message = code.getMessage();
        } else {
            this.code = CodeEnum.SUCCESS.getCode();
            this.message = CodeEnum.SUCCESS.getMessage();
        }
    }
    
    /**
     * 指定code构造对象
     * 
     * @param code 响应编码状态枚举
     * @return RestfulResponse 接口返回结果
     */
    public static RestfulResponse<Void> build(CodeEnum code) {
        RestfulResponse<Void> response = new RestfulResponse<>(code);
        return response;
    }
    
    /**
     * 指定message构造对象
     * 
     * @param message 响应消息
     * @return RestfulResponse 接口返回结果
     */
    public static RestfulResponse<Void> build(String message) {
        RestfulResponse<Void> response = new RestfulResponse<>();
        return response.message(message);
    }
    
    /**
     * 指定data构造对象
     * 
     * @param data 响应数据
     * @return RestfulResponse 接口返回结果
     */
    public static <T> RestfulResponse<T> build(T data) {
        RestfulResponse<T> response = new RestfulResponse<T>(data);
        return response;
    }
    
    /**
     * 指定code和message构造对象
     * 
     * @param code 响应编码状态枚举
     * @param message 响应消息
     * @return RestfulResponse 接口返回结果
     */
    public static RestfulResponse<Void> build(CodeEnum code, String message) {
    	RestfulResponse<Void> response = new RestfulResponse<>(code);
    	return response.message(message);
    }
    
    /**
     * 指定data构造对象
     * 
     * @param data 响应数据
     * @param message 响应消息
     * @return RestfulResponse 接口返回结果
     */
    public static <T> RestfulResponse<T> build(T data, String message) {
        RestfulResponse<T> response = new RestfulResponse<T>(data);
        return response.message(message);
    }
    
    /**
     * 指定data和code构造对象
     * 
     * @param data 响应数据
     * @param code 响应编码状态枚举
     * @return RestfulResponse 接口返回结果
     */
    public static <T> RestfulResponse<T> build(T data, CodeEnum code) {
        RestfulResponse<T> response = new RestfulResponse<>(data, code);
        return response;
    }
    
    /**
     * 设置属性并返回对象
     * 
     * @param messagex 设置 message 属性值为参数值 messagex
     * @return this 返回设置好的对象
     */
    private RestfulResponse<T> message(String messagex) {
        this.message = messagex;
        return this;
    }
    
    
    /**
     * @return 获取 code属性值
     */
    public int getCode() {
        return code;
    }
    
    /**
     * @param code 设置 code 属性值为参数值 code
     */
    public void setCode(int code) {
        this.code = code;
    }

    
    /**
     * @return 获取 data属性值
     */
    public T getData() {
        return data;
    }

    
    /**
     * @param data 设置 data 属性值为参数值 data
     */
    public void setData(T data) {
        this.data = data;
    }

    
    /**
     * @return 获取 message属性值
     */
    public String getMessage() {
        return message;
    }

    /**
     * @param message 设置 message 属性值为参数值 message
     */
    public void setMessage(String message) {
        this.message = message;
    }
    
}
